package es.gesfutbol.util;

import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;

public class GesFutbolValidatorUtils extends ValidationUtils{

	protected static boolean reject(final Errors errMsgs, final String propertyName, final String errorMessage) {
		errMsgs.rejectValue(propertyName, "", errorMessage);
		return true;
	}

	/**
	 * rebutja un valor de propietat si val null
	 *
	 * @param errMsgs instÃ ncia de <tt>BindException</tt>
	 * @param propertyName nom de la propietat a validar
	 * @param errorMessage missatge d'error en cas de propietat rebutjada
	 * @return <tt>true</tt> si la propietat ha sigut rebutjada
	 */
	protected static boolean rejectIfNull(final Errors errMsgs, final String propertyName, final String errorMessage) {
		if (errMsgs.getFieldValue(propertyName) == null) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja un valor de propietat si no val null
	 *
	 * @param errMsgs instÃ ncia de <tt>BindException</tt>
	 * @param propertyName nom de la propietat a validar
	 * @param errorMessage missatge d'error en cas de propietat rebutjada
	 * @return <tt>true</tt> si la propietat ha sigut rebutjada
	 */
	protected static boolean rejectIfNotNull(final Errors errMsgs, final String propertyName, final String errorMessage) {
		if (errMsgs.getFieldValue(propertyName) != null) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja un valor de propietat si val cadena buida Ã³ null
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfIsEmpty(final Errors errMsgs, final String propertyName, final String errorMessage) {
		if (errMsgs.getFieldValue(propertyName) == null || "".equals(errMsgs.getFieldValue(propertyName).toString())) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja un valor si no pot convertir-se a un valor numÃ¨ric (double)
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfNotNumericValue(final Errors errMsgs, final String propertyName,
			final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		try {
			Double.valueOf(errMsgs.getFieldValue(propertyName).toString());
		} catch (final NumberFormatException e) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja un valor si no pot convertir-se a un valor numÃ¨ric enter
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfNotIntegerValue(final Errors errMsgs, final String propertyName,
			final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		try {
			Integer.valueOf(errMsgs.getFieldValue(propertyName).toString());
		} catch (final NumberFormatException e) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja el valor d'una propietat numÃ¨rica (Integer,Long,Float Ã³ Double)
	 * si no pertany al rang especificat per [start..end].
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param start
	 * @param end
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfNumericIsOutOfRange(final Errors errMsgs, final String propertyName,
			final double start, final double end, final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		Double value = null;
		try {
			value = Double.valueOf(errMsgs.getFieldValue(propertyName).toString());
		} catch (final NumberFormatException e) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}

		if (start > value || value > end) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja un valor si, un cop convertit a String, tÃ© una longitud en
	 * carÃ cters menor que la requerida.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param length longitud en carÃ cters requerida
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfLengthIsLessThan(final Errors errMsgs, final String propertyName,
			final int length, final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		if (errMsgs.getFieldValue(propertyName).toString().length() < length) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja un valor si, un cop convertit a String, tÃ© una longitud en
	 * carÃ cters major que la requerida.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param length longitud en carÃ cters requerida
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfLengthIsGreaterThan(final Errors errMsgs, final String propertyName,
			final int length, final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		if (errMsgs.getFieldValue(propertyName).toString().length() > length) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja un valor si, un cop convertit a String, tÃ© una longitud fora del
	 * rang imposat.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param min Longitud mÃ­nima
	 * @param max Longitud mÃ xima
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfLengthIsOutOfRange(final Errors errMsgs, final String propertyName, final int min,
			final int max, final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		if (rejectIfLengthIsLessThan(errMsgs, propertyName, min, errorMessage)
				|| rejectIfLengthIsGreaterThan(errMsgs, propertyName, max, errorMessage)) {
			return true;
		}
		return false;
	}

	/**
	 * Valida un DNI/NIF: ha de tenir 9 carÃ cters, els 8 primers convertibles a
	 * numÃ¨ric, i el cÃ lcul ha de quadrar amb la lletra final.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfInvalidNIF(final Errors errMsgs, final String propertyName,
			final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)
				|| rejectIfLengthIsOutOfRange(errMsgs, propertyName, 9, 9, errorMessage)) {
			return true;
		}

		final String lletresNIF = "TRWAGMYFPDXBNJZSQVHLCKET";

		String primeraLletra = null;
		String cadena = null;
		String lletra = null;
		String xifres = null;

		try {
			cadena = errMsgs.getFieldValue(propertyName).toString();
			primeraLletra = cadena.substring(0, 1).toUpperCase();
			xifres = cadena.substring(1, cadena.length() - 1);
			lletra = cadena.substring(cadena.length() - 1).toUpperCase();
		} catch (final IndexOutOfBoundsException e) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}

		// valida primeraLletra
		if (primeraLletra.charAt(0) >= '0' && primeraLletra.charAt(0) <= '9') {
			xifres = primeraLletra + xifres;
		} else {
			final String primeresLletres = "LKXYM";
			if (primeresLletres.indexOf(primeraLletra) == -1) {
				errMsgs.rejectValue(propertyName, "", errorMessage);
				return true;
			}
		}

		Long valor = null;
		try {
			valor = Long.valueOf(xifres);
		} catch (final NumberFormatException e) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}

		if (lletra.charAt(0) != lletresNIF.charAt((int) (valor % 23))) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

//	/**
//	 * sobre aquesta validaciÃ³, consultar
//	 * <tt>http://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci
//	 * %C3%B3n_fiscal#NIF_de_Personas_f.C3.ADsicas}</tt>
//	 *
//	 * @param errMsgs
//	 * @param propertyName
//	 * @param errorMessage
//	 * @return
//	 * @deprecated
//	 */
//	@Deprecated
//	protected static boolean rejectIfInvalidNIFjuridic(final Errors errMsgs, final String propertyName,
//			final String errorMessage) {
//
//		if (rejectIfNull(errMsgs, propertyName, errorMessage)
//				|| rejectIfLengthIsOutOfRange(errMsgs, propertyName, 9, 9, errorMessage)) {
//			return true;
//		}
//
//		final String lletresNIF = "TRWAGMYFPDXBNJZSQVHLCKET";
//
//		String primeraLletra = null;
//		String cadena = null;
//		String lletra = null;
//		String xifres = null;
//		try {
//			cadena = errMsgs.getFieldValue(propertyName).toString();
//			primeraLletra = cadena.substring(0, 1).toUpperCase();
//			xifres = cadena.substring(1, cadena.length() - 1);
//			lletra = cadena.substring(cadena.length() - 1).toUpperCase();
//		} catch (final IndexOutOfBoundsException e) {
//			errMsgs.rejectValue(propertyName, "", errorMessage);
//			return true;
//		}
//
//		// Letra Naturaleza jurÃ­dica Comentario
//		// A Sociedades anÃ³nimas Caracter de control: NumÃ©rico
//		// B Sociedades de responsabilidad limitada Caracter de control:
//		// NumÃ©rico
//		// C Sociedades colectivas Caracter de control: NumÃ©rico
//		// D Sociedades comanditarias Caracter de control: NumÃ©rico
//		// E Comunidades de bienes y herencias yacentes Caracter de control:
//		// NumÃ©rico
//		// F Sociedades cooperativas Caracter de control: NumÃ©rico
//		// G Asociaciones Caracter de control: NumÃ©rico
//		// H Comunidades de propietarios en rÃ©gimen de propiedad horizontal
//		// Caracter de control: NumÃ©rico
//		// J Sociedades civiles, con o sin personalidad jurÃ­dica Caracter de
//		// control: NumÃ©rico
//		// P Corporaciones Locales CarÃ¡cter de control: AlfabÃ©tico
//		// Q Organismos pÃºblicos CarÃ¡cter de control: AlfabÃ©tico
//		// R Congregaciones e instituciones religiosas CarÃ¡cter de control:
//		// AlfabÃ©tico
//		// S Ã“rganos de la AdministraciÃ³n del Estado y de las Comunidades
//		// AutÃ³nomas CarÃ¡cter de control: AlfabÃ©tico
//		// U Uniones Temporales de Empresas Caracter de control: NumÃ©rico
//		// V Otros tipos no definidos en el resto de claves Caracter de control:
//		// NumÃ©rico
//		// N Entidades extranjeras CarÃ¡cter de control: AlfabÃ©tico
//		// W Establecimientos permanentes de entidades no residentes en EspaÃ±a
//		// CarÃ¡cter de control: AlfabÃ©tico
//
//		// valida primeraLletra
//		final String primeresLletres = "ABCDEFGHJPQRSUVNW";
//		if (primeresLletres.indexOf(primeraLletra) == -1) {
//			errMsgs.rejectValue(propertyName, "", errorMessage);
//			return true;
//		}
//
//		Long valor = null;
//		try {
//			valor = Long.valueOf(xifres);
//		} catch (final NumberFormatException e) {
//			errMsgs.rejectValue(propertyName, "", errorMessage);
//			return true;
//		}
//
//		if (lletra.charAt(0) != lletresNIF.charAt((int) (valor % 23))) {
//			errMsgs.rejectValue(propertyName, "", errorMessage);
//			return true;
//		}
//		return false;
//	}
//
//	/**
//	 * rebutja un CIF si detecta longitud/format incorrecte, si el dÃ­git de
//	 * tipus de societat Ã©s invÃ lid, o bÃ© si el dÃ­git de control calculat no
//	 * quadra amb el donat. p.ex. el mateix CIF vÃ lid pot venir de diferents
//	 * maneres igualment correctes: A58818501, A5881850A, a5881850a. valors per
//	 * a tipus de societat (1r dÃ­git): A - Sociedades AnÃ³nimas B - Sociedades de
//	 * responsabilidad limitada C - Sociedades colectivas D - Sociedades
//	 * comanditarias E - Comunidades de bienes F - Sociedades cooperativas G -
//	 * Asociaciones y otros tipos no definidos H - Comunidades de propietarios P
//	 * - Corporaciones locales Q - Organismos autÃ³nomos S - Organos de la
//	 * administraciÃ³n K, L y M - seguramente para compatibilidad con formatos
//	 * antiguos X - Extranjeros, que en lugar del D.N.I. tienen el N.I.E. dÃ­gits
//	 * de control (pot ser una lletra, o un dÃ­git numÃ¨ric, Ãºltim dÃ­git) J = 0, A
//	 * = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 10
//	 *
//	 * @param errMsgs
//	 * @param propertyName
//	 * @param errorMessage
//	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
//	 * @deprecated
//	 */
//	@Deprecated
//	protected static boolean rejectIfInvalidCIF(final Errors errMsgs, final String propertyName,
//			final String errorMessage) {
//
//		// rebutja si el camp Ã©s null, Ã³ bÃ© si la longitud no Ã©s de 9 carÃ cters
//		if (rejectIfNull(errMsgs, propertyName, errorMessage)
//				|| rejectIfLengthIsOutOfRange(errMsgs, propertyName, 9, 9, errorMessage)) {
//			return true;
//		}
//
//		final String tipus_societat = "ABCDEFGHPQSKLMX";
//		final String lletresCIF = "JABCDEFGHIJ";
//		final String xifresCIF = "0123456789J";
//
//		String cadena = null;
//		String tipSoci = null;
//		String lletra = null;
//		String xifres = null;
//
//		// extreu de la cadena CIF els elements a validar
//		try {
//			cadena = errMsgs.getFieldValue(propertyName).toString();
//			tipSoci = cadena.substring(0, 1).toUpperCase();
//			lletra = cadena.substring(cadena.length() - 1).toUpperCase();
//			xifres = cadena.substring(1, cadena.length() - 1);
//		} catch (final IndexOutOfBoundsException e) {
//			errMsgs.rejectValue(propertyName, errorMessage + ": error en longitud");
//			return true;
//		}
//
//		// verifica que el dÃ­git de tipus de societat estigui dins dels
//		// possibles
//		if (tipus_societat.indexOf(tipSoci.charAt(0)) == -1) {
//			// rejecta: el dÃ­git de tipus de societat incorrecte
//			errMsgs.rejectValue(propertyName, errorMessage + ": dÃ­git de tipus de societat incorrecte");
//			return true;
//		}
//
//		// calcula el sumatori de xifres
//		int sum = 0;
//		for (int i = 0; i < xifres.length(); i++) {
//			if (i % 2 == 0) {
//				sum += xifres.charAt(i) - '0'; // dÃ­git parell
//			} else {
//				sum += (xifres.charAt(i) - '0') * 2; // dÃ­git senar
//			}
//		}
//
//		// mÃ²dul del sumatori
//		sum = 10 - (sum % 10);
//
//		// verifica el dÃ­git de control
//		if (lletra.charAt(0) == lletresCIF.charAt(sum) || lletra.charAt(0) == xifresCIF.charAt(sum)) {
//			return false; // accepta
//		} else {
//			// rejecta: el dÃ­git de control no quadra
//			errMsgs.rejectValue(propertyName, errorMessage + "dÃ­git de control incorrecte: " + lletra.charAt(0) + "==>"
//					+ xifresCIF.charAt(sum));
//			return true;
//		}
//	}

	/**
	 * rebutja la propietat si la representaciÃ³ alfanumÃ¨rica del seu valor no Ã©s
	 * acceptada per l'expressiÃ³ regular suministrada.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param regExp
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfRegExpNotMatches(final Errors errMsgs, final String propertyName,
			final String regExp, final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		final Pattern pattern = Pattern.compile(regExp);
		final Matcher matcher = pattern.matcher(errMsgs.getFieldValue(propertyName).toString());
		if (!matcher.matches()) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * <ul>
	 * <li>Obs.1: el camp 'mes' ha de ser 0-based, o sigui, el mes de Gener Ã©s
	 * el 0, Febrer Ã©s 1, ...</li>
	 * <li>Obs.2: si la data Ã©s invÃ lida, el missatge d'error Ã©s rejectat contra
	 * la propietat d'any.</li>
	 *
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfInvalidDate(final Errors errMsgs, final String diaPropertyName,
			final String mesPropertyName, final String anyPropertyName, final String errorMessage) {

		try {
			/*
			 * si algun dels 3 camps no Ã©s numÃ¨ric-convertible, es llanÃ§a
			 * NumberFormatException, donant error de validaciÃ³
			 */
			final Integer idia = Integer.parseInt((String) errMsgs.getFieldValue(diaPropertyName));
			final Integer imes = Integer.parseInt((String) errMsgs.getFieldValue(mesPropertyName));
			final Integer iany = Integer.parseInt((String) errMsgs.getFieldValue(anyPropertyName));

			/*
			 * si la data no segueix el format especificat, o bÃ© si Ã©s
			 * incorrecta (p.ex. 30 de Febrer) es dÃ³na ParseException, donant
			 * error de validaciÃ³.
			 */
			final SimpleDateFormat formatData = new SimpleDateFormat("dd/MM/yyyy");
			formatData.setLenient(false);
			formatData.parse(idia + "/" + imes + "/" + iany);

		} catch (final Exception e) {
			errMsgs.rejectValue(anyPropertyName, errorMessage, e.toString());
			return true;
		}
		return false;
	}

	protected static boolean rejectIfInvalidNumericDate(final Errors errMsgs, final String diaPropertyName,
			final String mesPropertyName, final String anyPropertyName, final String errorMessage) {

		try {
			/*
			 * si algun dels 3 camps no Ã©s numÃ¨ric-convertible, es llanÃ§a
			 * NumberFormatException, donant error de validaciÃ³
			 */
			final Integer idia = (Integer) errMsgs.getFieldValue(diaPropertyName);
			final Integer imes = (Integer) errMsgs.getFieldValue(mesPropertyName);
			final Integer iany = (Integer) errMsgs.getFieldValue(anyPropertyName);

			/*
			 * si la data no segueix el format especificat, o bÃ© si Ã©s
			 * incorrecta (p.ex. 30 de Febrer) es dÃ³na ParseException, donant
			 * error de validaciÃ³.
			 */
			final SimpleDateFormat formatData = new SimpleDateFormat("dd/MM/yyyy");
			formatData.setLenient(false);
			formatData.parse(idia + "/" + imes + "/" + iany);

		} catch (final Exception e) {
			errMsgs.rejectValue(anyPropertyName, errorMessage, e.toString());
			return true;
		}
		return false;
	}

	/**
	 * rebutja la propietat si Ã©s <tt>null</tt>, si no Ã©s de tipus
	 * <tt>java.lang.Boolean</tt>, o bÃ© si el seu valor Ã©s <tt>Boolean.TRUE</tt>
	 * .
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfTrue(final Errors errMsgs, final String propertyName, final String errorMessage) {

		final Object propertyValue = errMsgs.getFieldValue(propertyName);

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}
		if (!(propertyValue instanceof Boolean)) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		if (((Boolean) propertyValue).equals(Boolean.TRUE)) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja la propietat si Ã©s <tt>null</tt>, si no Ã©s de tipus
	 * <tt>java.lang.Boolean</tt>, o bÃ© si el seu valor Ã©s
	 * <tt>Boolean.FALSE</tt>.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfFalse(final Errors errMsgs, final String propertyName, final String errorMessage) {

		final Object propertyValue = errMsgs.getFieldValue(propertyName);

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}
		if (!(propertyValue instanceof Boolean)) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		if (((Boolean) propertyValue).equals(Boolean.FALSE)) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}
		return false;
	}

	/**
	 * rebutja <tt>propertyName1</tt> si el seu valor Ã©s igual al de
	 * <tt>propertyName2</tt>.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfEqual(final Errors errMsgs, final String propertyName1,
			final String propertyName2, final String errorMessage) {

		final Object propertyValue1 = errMsgs.getFieldValue(propertyName1);
		final Object propertyValue2 = errMsgs.getFieldValue(propertyName2);

		if (propertyValue1 == null) {
			if (propertyValue2 == null) {
				errMsgs.rejectValue(propertyName1, errorMessage);
				return true;
			} else {
				return false;
			}
		} else {
			if (propertyValue1.equals(propertyValue2)) {
				errMsgs.rejectValue(propertyName1, errorMessage);
				return true;
			}
		}

		return false;
	}

	/**
	 * rebutja <tt>propertyName1</tt> si el seu valor <b>no</b> Ã©s igual al de
	 * <tt>propertyName2</tt>.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfNotEqual(final Errors errMsgs, final String propertyName1,
			final String propertyName2, final String errorMessage) {

		final Object propertyValue1 = errMsgs.getFieldValue(propertyName1);
		final Object propertyValue2 = errMsgs.getFieldValue(propertyName2);

		if (propertyValue1 == null) {
			if (propertyValue2 == null) {
				return false;
			} else {
				errMsgs.rejectValue(propertyName1, errorMessage);
				return true;
			}
		} else {
			if (!propertyValue1.equals(propertyValue2)) {
				errMsgs.rejectValue(propertyName1, errorMessage);
				return true;
			}
		}

		return false;
	}

	/**
	 * rebutja la propietat si la representaciÃ³ alfanumÃ¨rica del seu valor contÃ©
	 * algun tipus de carÃ cter separador: espai, tabulador, salt de lÃ­nia, etc.
	 *
	 * @param errMsgs
	 * @param propertyName
	 * @param regExp
	 * @param errorMessage
	 * @return Resultat de la validaciÃ³: TRUE -> NOK / FALSE -> OK
	 */
	protected static boolean rejectIfWhitespace(final Errors errMsgs, final String propertyName,
			final String errorMessage) {

		if (rejectIfNull(errMsgs, propertyName, errorMessage)) {
			return true;
		}

		final String fieldValue = '[' + errMsgs.getFieldValue(propertyName).toString() + ']';
		if (fieldValue.split("\\s").length > 1) {
			errMsgs.rejectValue(propertyName, "", errorMessage);
			return true;
		}

		return false;
	}
}
